const   gui         =   require('nw.gui'),  // nw gui
        fs          =   require('fs'),      // nodejs 内置 文件模块
        http        =   require('http'),    // nodejs 内置 http模块
        request     =   require('request'), // nodejs request 模块
        unzip       =   require('unzip'),   // nodejs 解压缩 模块
        os          =   require('os'),      // nodejs os 模块
        config      =   require('./config/config'), // 获取远程项目信息
        win         =   gui.Window.get(),   // 执行窗口
        mf          =   gui.App.manifest,   // 读取配置
        env         =   mf.env,             // 设置当前环境变量
        platform    =   (os.platform() === 'darwin') ? 'mac' : 'win',
        $loading    =   $('#loading');      // loading容器


let vFlag           =   false;              // 程序是否正在自动更新 
const   uM = {                              // 弹窗对象
    modal:          $('#updateModel'),      // modal 弹窗容器
    modalBody:      $('.modal-body'),       // 显示 弹窗内容容器
	backDrop:       $('.modal-backdrop'),   // 蒙层  
	sureBtn:        $('#sure-btn'),         // 确认按钮 (居右)
	backBtn:        $('#back-btn'),         // 取消按钮 (居左)

    // 初始化方法
	init() {
		$('.updateModel-close,#back-btn').off('click').on('click', () => this.modalHide());   // 关闭按钮以及取消按钮点击事件触发弹窗、蒙层关闭
	},
	// 显示弹窗
	modalShow(html) {
		html ? this.modalBody.empty() && this.modalBody.append(html)  : '';   // 添加弹窗主体结构
		this.modal.removeClass('hide');      // 显示弹窗
		this.backDrop.removeClass('hide');   // 显示蒙层				
	},
	// 隐藏
	modalHide() {
        newVersion.clipboard.destroy();
		this.modal.addClass('hide');         // 隐藏弹窗 
		this.backDrop.addClass('hide');      // 隐藏蒙层		
	},
	// 确认
	sureAction(callback) {
		this.sureBtn.off('click').on('click', () => {
			this.modalHide();
            typeof callback === 'function' && callback();   // 如果有回调就执行
		});			
	},
	// 关闭
	backAction() {
		this.backBtn.off('click').on('click', () => this.modalHide());			
	},
};

// 右上角关闭事件 关闭执行窗口

win.on('close', () => {
    if (!vFlag) { 
    	uM.modalShow("<p style='text-align:center;'>关闭窗口或者最小化？</p>"); 
    	uM.sureBtn.text('最小化')
    	uM.sureBtn.off('click').on('click', () => {
            uM.modalHide();
    		win.hide();
    		uM.backBtn.text('取消');
    		uM.sureBtn.text('确认');
    	}); 
    	uM.backBtn.text('关闭')
    	uM.backBtn.off('click').on('click', () => refreshUsers());  // 关闭执行窗口并且调用用户登出接口
    } else {noStopGetVersion()}
});

// 用户登出
let refreshUsers = () =>{
    var url =  config[env].loginOut;
    $.get(url,'', (res,status) => gui.App.quit()); 
}

// 托盘
let tray = new gui.Tray({
	title: process.platform == "darwin" ? '' : 'MPS客资管理系统', 
	icon: process.platform == "darwin" ? config[env].trayMacIcon : config[env].trayIcon,
	tooltip: "MPS客资管理系统"
});

// 托盘菜单
let trayMenu = new gui.Menu();
trayMenu.append(new gui.MenuItem({label: '打开MPS', click() {
    // !vFlag ? uM.modalHide() && win.show() : noStopGetVersion();
    if (!vFlag) {
        uM.modalHide();
        win.show();
    } else {noStopGetVersion()}
}}));
trayMenu.append(new gui.MenuItem({label: '升级更新', click() {
    if (!vFlag) {
        win.show();
        newVersion.init('click');
    } else {noStopGetVersion()}
}}));
trayMenu.append(new gui.MenuItem({label: '当前版本', click() {
    if (!vFlag) {
        win.show();
        uM.modalShow("<p style='text-align:center;'>您当前版本为"+mf.version+"</p>");
        uM.sureBtn.text('确认');
        uM.sureAction();
    } else {noStopGetVersion()}
}}));
trayMenu.append(new gui.MenuItem({label: '退出MPS', click() {
    if (!vFlag) {
        win.show();
        uM.modalShow("<p style='text-align:center;'>是否要退出应用</p>");
        uM.sureBtn.off('click').on('click', () => refreshUsers());  
        uM.backAction();
    } else {noStopGetVersion()}	
}}));
tray.menu = trayMenu;
tray.on('click', () => {
    !vFlag ? uM.modalHide() && win.show() : noStopGetVersion();
});

// 新开窗口配置
win.on('new-win-policy', (frame, url, policy) => {
    policy.setNewWindowManifest({
        "min_width": 450,
        "min_height": 200,
        "width": 450,
        "height": 200,
        "resizable": false
    });
});

// 自动更新最新版本
// 0.1.0-20161219-build1
let newVersion = {
    version     :  mf.version,  // 当前本地版本
    nVersion    : '',           // 当前服务器版本
    exePath     : '',           // 执行文件路径
    _nwpath     : '',           // 放置替换.nw的路径
    clipboard   : '',
    copyBtn     : '',

    // 初始化方法
    init(type) {
        // 获取执行文件路径
        this.exePath = $('#exe-path').val(); 
        // 如果是mac系统并且执行文件路径不为空
        if (platform === 'mac' && this.exePath !== "") {
            this._nwpath = this.exePath.substring(0,this.exePath.indexOf("/Versions"))+'/Resources';
        } 
        if (platform === 'win' && this.exePath !== "") {
            this._nwpath = this.winName(this.exePath);
        }

        // 获取最新版本
        $.ajax({  
            type : "get",  
            url : config[env].getVersionUrl,  
            dataType : "jsonp",//数据类型为jsonp  
            jsonpCallback: 'jsonpCallback',
            success: function(json){
                newVersion.nVersion = json[platform].versionNumber;
                newVersion.matching(type, json[platform].downloadAddress);  // 匹配版本
            }  
        });
    },
    // 本地与服务器匹配版本
    matching(type, url) {
        if (this.version !== this.nVersion) {
            if (this.version.split('.')[0] !== this.nVersion.split('.')[0]) {
                win.show();
                setTimeout(() => {
                    uM.modalShow("<p style='text-align:center;'>检测到客户端有更新, 下载地址为：<span style='color:#07f;'>"+url+"<i class='copyIcon' data-className='.copyIcon' data-clipboard-text="+url+" title='点我复制'></i></span>  （复制上方的链接地址，并在浏览器中访问该地址进行下载）</p>");
                    uM.backBtn.text('取消');
                    uM.sureBtn.text('确认');
                    uM.sureAction();
                    newVersion.clipboard = '';
                    newVersion.copyBtn = '';
                    newVersion.copyBtn = $('body').find('.copyIcon').attr('data-className');
                    newVersion.clipboard = new Clipboard(newVersion.copyBtn);
                    newVersion.clipboard.on('success', function(e) {
                        $('.msg-container').fadeIn(1000, function() {
                            setTimeout(function() {
                                $('.msg-container').fadeOut();
                            },1500)                            
                        });
                        e.clearSelection();
                        
                    });
                    newVersion.clipboard.on('error', function(e) {
                        $('.msg-container').text('复制失败').fadeIn(1000, function() {
                            setTimeout(function() {
                                $('.msg-container').fadeOut();
                            },1500)                            
                        });
                    });
                    // uM.sureAction(() => setTimeout(() => {
                    //     $loading.removeClass('hide');
                    //     $loading.find('h1').eq(0).text('下载中，请稍候 ...');
                    //     // 这里应该跳转下载链接
                    //     this.download(url, 'MPS-'+ mf.env + '.zip', () => {
                    //         $loading.find('h1').eq(0).text('下载成功! 即将关闭客户端，请稍后重启！');
                    //         setTimeout(() => { this.quit()},1000);                           
                    //     });
                    // },1000));
                    uM.backAction();
                },500); 
                return;               
            }
            win.show();
            setTimeout(() => {
                uM.modalShow("<p style='text-align:center;'>检测到有新版本, 是否需要更新版本？</p>");
                uM.backBtn.text('取消');
                uM.sureBtn.text('更新');
                uM.sureAction(() => setTimeout(() => {
                    vFlag = true;
                    this.downFile(url);
                },1000));
                uM.backAction();
            },500);
        } else {
            if (type === 'click') {
                uM.modalShow("<p style='text-align:center;'>您当前已是最新版本</p>");
                uM.sureAction();
            } else {return false;}
        }        
    },
    // 下载  下载完成解压
    downFile(url) {
        this.download(url, 'app.zip', () => this.unZip());
    },
    // 实施下载压缩包  下载成功执行回调解压
    download(url, filename, callback) {
        uM.backDrop.removeClass('fade hide').addClass('loading');
        $loading.removeClass('hide');
        request.head(url, (err, res, body) => request(url).pipe(fs.createWriteStream(filename)).on('close', callback));
    },
    // 解压新版本压缩包
    unZip() {
        $loading.find('h1').eq(0).text('解压中 ...');
        setTimeout(() => {
            fs.createReadStream('app.zip')
                .pipe(unzip.Extract({ path: this._nwpath}))
                .on('finish', () => { 
                    $loading.find('h1').eq(0).text('解压成功! 即将关闭客户端，请稍后重启！');
                    this.quit();
                });
        }, 2000);        
    },
    // window 平台解析 得到替换.nw路径
    winName(filename, ds) {
        ds = ds || "/";
        return  filename.replace(/\/|\\/g, ds).replace(new RegExp("\\"+ds+"[^\\"+ds+"]*?$"), "");
        // console.log( dir_name("E:\\nwjs-v0.19.2-win-x64\\nw.exe"));
        // console.loxg( dir_name("E:\\nwjs-v0.19.2-win-x64\\nw.exe", "\\"));
    },
    // 定时退出客户端
    quit() { setTimeout(() => gui.App.quit(), 3000)}
};

// 程序更新过程中不能中断更新
let noStopGetVersion = () => {
    uM.modalShow("<p style='text-align:center;'>程序自动更新中，请勿操作！</p>"); 
    uM.sureBtn.text('确认');
    uM.sureBtn.off('click').on('click', () => uM.modal.addClass('hide')); 
    uM.backBtn.text('取消');
    $('.updateModel-close,#back-btn').off('click').on('click', () => uM.modal.addClass('hide'));  
};



// 网络监测,网络恢复时进入登录页面
let monitoringStatus = true;//网络正常/网络异常
let useState = true;//正常使用/已经断开
$.ajaxSetup({  
    async : false
}); 
let monitoringNetwork = () => {
    let url = $(window.parent.document).find("#pageIframe").attr("src");//获取入口url
    var i = 0;

    $.ajax({  
        type : "get",  
        url : config[env].getVersionUrl,  
        dataType : "jsonp",//数据类型为jsonp  
        jsonpCallback: 'jsonpCallback',
        success: function(json){  
            i = 1;
            monitoringStatus = true;
        }  
    });

    if (0 == i) {
        monitoringStatus = false;
        useState = false;
    }
    if (false == useState && true == monitoringStatus) {
        document.getElementById("pageIframe").src= url;
        useState = true;
    }
}

// js 初始化
$(function() {   
    win.show(); // 显示窗口
    gui.App.clearCache();  // 清除缓存(没变化)
    // loading
    $loading.removeClass('hide');
    $loading.find('h1').eq(0).text('加载中，请稍候 ...');
    // 把当前exe执行文件录入写入input
    $('#exe-path').val(process.execPath);
    // 把当前项目路径写入iframe
    let date = new Date();  // 加入时间戳做版本控制
    $('#pageIframe').attr('src', config[env].url+'?time='+ date.getTime());
    // 所有资源加载完成后执行
    let count = 0;
    $('#pageIframe').on('load', () => {
        count++;
        $loading.addClass('hide'); 
        // 初始化弹窗
        uM.init();   
        // 获取最新版本
        (count === 1) && newVersion.init();     
    })

    // 网络监测
    setInterval(function() {
     monitoringNetwork();
    },3000)
});